// Copyright 2019 Google LLC.
#ifndef ParagraphPainter_DEFINED
#define ParagraphPainter_DEFINED

#include "include/core/SkPaint.h"
#include "include/core/SkTextBlob.h"

#include <optional>
#include <variant>

namespace skia {
namespace textlayout {
class ParagraphPainter {
public:
    typedef int PaintID;
    typedef std::variant<SkPaint, PaintID> SkPaintOrID;

    struct DashPathEffect {
        DashPathEffect(SkScalar onLength, SkScalar offLength);

        SkScalar fOnLength;
        SkScalar fOffLength;
    };

    class DecorationStyle {
    public:
        DecorationStyle();
        DecorationStyle(SkColor color, SkScalar strokeWidth, std::optional<DashPathEffect> dashPathEffect);

        SkColor getColor() const
        {
            return fColor;
        }
        SkScalar getStrokeWidth() const
        {
            return fStrokeWidth;
        }
        std::optional<DashPathEffect> getDashPathEffect() const
        {
            return fDashPathEffect;
        }
        const SkPaint &skPaint() const
        {
            return fPaint;
        }

    private:
        SkColor fColor;
        SkScalar fStrokeWidth;
        std::optional<DashPathEffect> fDashPathEffect;
        SkPaint fPaint;
    };

    virtual ~ParagraphPainter() = default;

    virtual void drawTextBlob(const sk_sp<SkTextBlob> &blob, SkScalar x, SkScalar y, const SkPaintOrID &paint) = 0;
    virtual void drawTextShadow(const sk_sp<SkTextBlob> &blob, SkScalar x, SkScalar y, SkColor color,
        SkScalar blurSigma) = 0;
    virtual void drawRect(const SkRect &rect, const SkPaintOrID &paint) = 0;
    virtual void drawFilledRect(const SkRect &rect, const DecorationStyle &decorStyle) = 0;
    virtual void drawPath(const SkPath &path, const DecorationStyle &decorStyle) = 0;
    virtual void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const DecorationStyle &decorStyle) = 0;

    virtual void clipRect(const SkRect &rect) = 0;
    virtual void translate(SkScalar dx, SkScalar dy) = 0;

    virtual void save() = 0;
    virtual void restore() = 0;
};
} // namespace textlayout
} // namespace skia

#endif // ParagraphPainter_DEFINED
